<?php

namespace Transaccion\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Transaccion\Controller\Service\GenericService;
use Maestros\Controller\Service\HoraService;
use Maestros\Controller\Service\PensumService;
use Maestros\Controller\Service\CuposSeccionService;
use Maestros\Controller\Service\EstadoOrganizacionSeccionService;
use Maestros\Controller\Service\HorarioService;
use Transaccion\Model\Dao\OrganizacionSeccionDAO;
use Transaccion\Model\Entity\OrganizacionSeccion;
use Transaccion\Controller\Service\PensumCursarService;

//SERVICIO
class OrganizacionSeccionService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $organizacionSeccionService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$organizacionSeccionService == null) {
            self::$organizacionSeccionService = new OrganizacionSeccionService($adapter);
        }
        return self::$organizacionSeccionService;
    }

    public function getOrganizacionSeccionDao() {
        return OrganizacionSeccionDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type Array
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $mensaje = 'ORGANIZACION SECCION NO ENCONTRADO';
        $organizacionSeccion = $this->obtenerOrganizacionSeccionSegunId($id);
        if ($organizacionSeccion->getId() != null) {
            $data[0] = $organizacionSeccion->objectToArray();
            $mensaje = 'ORGANIZACION SECCION ENCONTRADO';
            $success = true;
        }
        return $this->setOuput($success, $data, $mensaje);
        //return UtilsArrayController::organizarOutput($success, $data, null);
    }

    /**
     * @param type OrganizacionSeccion
     * @return type Array
     */
    public function getIds($organizacionSeccion) {
        $mensaje = 'BLOQUE NO REGISTRADO';
        $data = null;
        $success = false;
        $servicioHora = HoraService::getInstance($this->dbAdapter);
        $hora = $servicioHora->getRegistro($organizacionSeccion->getHora());
        $servicioDia = DiaService::getInstance($this->dbAdapter);
        $dia = $servicioDia->getRegistro($organizacionSeccion->getDia());
        if ($organizacionSeccion->getId() != null) {
            $success = true;
            $data[0] = $organizacionSeccion->objectToArray();
            $data[0]['_dia'] = $dia['data'][0]['id'];
            $data[0]['_hora'] = $hora['data'][0]['id'];
            $data[0]['_turno'] = $hora['data'][0]['_turno'];
            $mensaje = 'BLOQUE ENCONTRADO';
        }
        return $this->setOuput($success, $data, $mensaje);
    }

    /**
     * @param type OrganizacionSeccion
     * @return type Array
     */
    public function armarRegistroCompleto($organizacionSeccion) {
        $mensaje = 'ORGANIZACION SECCION NO REGISTRADO';
        $data = null;
        $success = false;
        $servicioCuposSeccion = CuposSeccionService::getInstance($this->dbAdapter);
        $cuposSeccion = $servicioCuposSeccion->getRegistroCompleto($organizacionSeccion->getCuposSeccion());
        $servicioEstadoOrganizacionSeccion = EstadoOrganizacionSeccionService::getInstance($this->dbAdapter);
        $estadoOrganizacionSeccion = $servicioEstadoOrganizacionSeccion->getRegistro($organizacionSeccion->getEstado());
        $servicioPensum = PensumService::getInstance($this->dbAdapter);
        $pensum = $servicioPensum->getRegistroCompleto($organizacionSeccion->getPensum());
        if ($organizacionSeccion->getId() != null) {
            $success = true;
            $data[0] = $organizacionSeccion->objectToArray();
            $data[0]['_cuposSeccion'] = $cuposSeccion['data'][0];
            $data[0]['_estado'] = $estadoOrganizacionSeccion['data'][0];
            $data[0]['_pensum'] = $pensum['data'][0];
            $mensaje = 'ORGANIZACION SECCION ENCONTRADO';
        }
        return $this->setOuput($success, $data, $mensaje);
    }

    /**
     * @param type Id
     * @return type array
     */
    public function getRegistroCompleto($id) {
        $organizacionSeccion = $this->obtenerOrganizacionSeccionSegunId($id);
        return $this->armarRegistroCompleto($organizacionSeccion);
    }

    /**
     * @param type Id
     * @return type array
     */
    public function obtenerIdsOrganizacionSeccion($id) {
        $organizacionSeccion = $this->obtenerOrganizacionSeccionSegunId($id);
        return $this->getIds($organizacionSeccion);
    }

    /**
     * @param type Id
     * @return type Objet
     */
    public function obtenerOrganizacionSeccionSegunId($id) {
        $registros = $this->getOrganizacionSeccionDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $organizacionSeccion = new OrganizacionSeccion($data[0]);
        $organizacionSeccion->setPensum($data[0]['id_pensum']);
        $organizacionSeccion->setSeccion($data[0]['id_seccion']);
        $organizacionSeccion->setLapso($data[0]['id_lapso']);
        $organizacionSeccion->setEstado($data[0]['id_estado']);
        $organizacionSeccion->setCuposSeccion($data[0]['id_cupos_seccion']);
        return $organizacionSeccion;
    }

    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArreglo($registros) {
        foreach ($registros as $row) {
            $organizacionSeccions[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($organizacionSeccions); $i++) {
            $organizacionSeccion = $this->getRegistroCompleto($organizacionSeccions[$i]['id']);
            $organizacionSeccions[$i] = $organizacionSeccion['data'];
        }
        return $organizacionSeccions;
    }

    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArregloHorario($registros) {
        foreach ($registros as $row) {
            $organizacionSeccions[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($organizacionSeccions); $i++) {
            $organizacionSeccion = $this->getRegistro($organizacionSeccions[$i]['id']);
            $servicioHorario = HorarioService::getInstance($this->dbAdapter);
            $horario = $servicioHorario->getIdsSegunIdOrganizacionSeccion($organizacionSeccions[$i]['id']);
            $materia = $this->getRegistroCompleto($organizacionSeccions[$i]['id']);
            $organizacionSeccion['data']['idMateria'] = $materia['data'][0]['_pensum']['_materia'][0]['codigoExterno'];
            $organizacionSeccion['data']['horario'] = $horario['data'];
            $organizacionSeccions[$i] = $organizacionSeccion['data'];
        }
        return $organizacionSeccions;
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getRegistrosSegunCedulaYLapso($cedula, $lapso) {
        $mensaje = 'HORARIO NO REGISTRADO';
        $success = false;
        $registros = $this->getOrganizacionSeccionDao()->getOrganizacionSeccionSegunCedulaYLapso($cedula, $lapso);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'HORARIO ENCONTRADO';
            $horarios = $this->llenarArreglo($registros);
        }
        return $this->setOuput($success, $horarios, $mensaje);
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getHorariosSegunCedulaLapsoYFase($cedula, $lapso, $fase) {
        $mensaje = 'HORARIO NO REGISTRADO';
        $success = false;
        $registros = $this->getOrganizacionSeccionDao()->getOrganizacionSeccionSegunCedulaLapsoYFase($cedula, $lapso, $fase);
        //echo count($registros);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'HORARIO ENCONTRADO';
            $horarios = $this->llenarArregloHorario($registros);
        } else {
            $horarios = null;
        }
        return $this->setOuput($success, $horarios, $mensaje);
    }

    public function getSeccionesDisponiblesSegunPensumLapso($idPensum, $lapso) {
        $registros = $this->getOrganizacionSeccionDao()->getOrganizacionSeccionesDisponiblesSegunPensumLapso($idPensum, $lapso);
        $data = UtilsArrayController::llenarData($registros);
        return $data;
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getHorariosSegunId($id) {
        $mensaje = 'HORARIO NO REGISTRADO';
        $success = false;
        $registros = $this->getOrganizacionSeccionDao()->getRegistro($id);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'HORARIO ENCONTRADO';
            $horarios = $this->llenarArregloHorario($registros);
        } else {
            $horarios = null;
        }
        return $horarios;
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getChoqueHorariosSegunIds($id1, $id2) {
        $mensaje = 'NO HAY CHOQUE DE HORARIO';
        $choque = 0;
        $data = null;
        $orgSecc1 = $this->getHorariosSegunId($id1);
        $orgSecc2 = $this->getHorariosSegunId($id2);
        $horario1 = $orgSecc1[0]['horario'];
        $horario2 = $orgSecc2[0]['horario'];
        $longitud1 = count(($horario1));
        $longitud2 = count(($horario2));
        //print_r($horario1);
        if ($horario1[0][0]['_organizacion_seccion'] == $horario2[0][0]['_organizacion_seccion']) {
            $choque = 0;
            $mensaje = 'YA ESTA INSCRITA';
            $data = 0;
        } else {
            $choque = false;
            for ($i = 0; $i < $longitud1; $i++) {
                for ($j = 0; $j < $longitud2; $j++) {
                    if ($horario1[$i][0]['_bloque']['_dia'] == $horario2[$j][0]['_bloque']['_dia']) {
                        if ($horario1[$i][0]['_bloque']['_hora'] == $horario2[$j][0]['_bloque']['_hora']) {
                            $choque = true;
                        }
                    }
                }
            }
        }
        if ($choque == true) {
            $mensaje = 'HAY CHOQUE DE HORARIO';
            $data = 1;
            $choque = 0;
        }
        return $this->setOuput($choque, $data, $mensaje);
    }

    public function actualizarCuposSeccionSegunOrganizacionId($id, $accion) {
        $organizacionSeccion = $this->obtenerOrganizacionSeccionSegunId($id);
        //$idorganizacionseccion = $organizacionSeccion->getId();
        //$CuposSeccionSegunOrganizacionSeccionId = $this->obtenerCuposSeccionSegunOrganizacionSeccionId($idorganizacionseccion);
        $idcuposseccion = $organizacionSeccion->getCuposSeccion();
        $servicioCuposSeccion = CuposSeccionService::getInstance($this->dbAdapter);
        $cuposseccion = $servicioCuposSeccion->getRegistro($idcuposseccion);
        $cantidad_inscritos = $cuposseccion['data'][0]['cantidadInscritos'];
        $a = $servicioCuposSeccion->updateCuposSeccionActualizar($idcuposseccion, $accion, $cantidad_inscritos);
    }

    public function obtenerCuposSeccionSegunOrganizacionSeccionId($id) {
        $data = null;
        $success = false;
        $mensaje = 'CUPOS SECCION SEGUN ID_ORGANIZACION_SECCION NO ENCONTRADO';
        $organizacionSeccion = $this->obtenerOrganizacionSeccionSegunId($id);
        if ($organizacionSeccion->getId() != null) {
            $idorganizacionseccion = $organizacionSeccion->getId();
            $idcuposseccion = $organizacionSeccion->getCuposSeccion();
            if ($idcuposseccion != null) {
                $success = true;
                $servicioCuposSeccion = CuposSeccionService::getInstance($this->dbAdapter);
                $cuposseccion = $servicioCuposSeccion->getRegistroCompleto($organizacionSeccion->getCuposSeccion());
                $data[0] = $cuposseccion['data'];
                $data[1] = $idorganizacionseccion['0'];
                $mensaje = 'CUPOS SECCION SEGUN ID_ORGANIZACION_SECCION ENCONTRADO';
            }
        }
        return $this->setOuput($success, $data, $mensaje);
    }

}
